<?php
/**
 * Created by PhpStorm.
 * User: lvpengdong
 * Date: 2017/4/24
 * Time: 11:09
 */

if (! function_exists('obj2arr')) {
    /**
     * 对象转数组
     * Generate a URL to a named route.
     *
     * @param  string $obj
     */
    function obj2arr($obj)
    {
        return json_decode(json_encode($obj), true);
    }
}

if (! function_exists('getMillisecond')) {
    function getMillisecond()
    {
        list($t1, $t2) = explode(' ', microtime());
        return (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000);
    }
}
if (! function_exists('unicodeDecode')) {
    /**
     * 转换json，保留中文
     * @param $name
     * @return string
     */
    function unicodeDecode($name)
    {
        $json = '{"str":"' . $name . '"}';
        $arr = json_decode($json, true);
        if (empty($arr)) return '';
        return $arr['str'];
    }
}

if (! function_exists('make_tree')) {
    /**
     * 把返回的数据集转换成Tree
     * @param array $list 要转换的数据集
     * @param string $pk 自增字段（栏目id）
     * @param string $pid parent标记字段
     * @return array
     * @author lpd <1696232133@qq.com>
     */
    function make_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
    {
        $tree=array();
        foreach ($list as $key => $val) {
            if ($val[$pid]==$root) {
                //获取当前$pid所有子类
                unset($list[$key]);
                if (! empty($list)) {
                    $child=make_tree($list, $pk, $pid, $child, $val[$pk]);
                    if (!empty($child)) {
                        $val['_child']=$child;
                    }
                }
                $tree[]=$val;
            }
        }
        return $tree;
    }
}

if (! function_exists('makeStaffOrgTree')) {
    /**
     * 把返回的数据集转换成Tree
     * @param array $list 要转换的数据集
     * @param string $pk 自增字段（栏目id）
     * @param string $pid parent标记字段
     * @return array
     * @author lpd <1696232133@qq.com>
     */
    function makeStaffOrgTree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
    {
        $tree=array();
        foreach ($list as $key => $val) {
            if ($val[$pid]==$root) {
                //获取当前$pid所有子类
                unset($list[$key]);
                if (! empty($list)) {
                    $children=makeStaffOrgTree($list, $pk, $pid, $child, $val[$pk]);
                    if (!empty($children)) {
                        $val[$child]=$children;
                    }
                }
                $tree[]=$val;
            }
        }
        return $tree;
    }
}
if (! function_exists('getMenuTree')) {
    /**
     * 递归无限级分类【先序遍历算】，获取任意节点下所有子孩子
     * @param array $arrCate 待排序的数组
     * @param int $parent_id 父级节点
     * @param int $level 层级数
     * @return array $arrTree 排序后的数组
     */
    function getMenuTree($arrCat, $parent_id = 0, $level = 0)
    {
        static $arrTree = array(); //使用static代替global
        if (empty($arrCat)) {
            return false;
        }
        $level++;
        foreach ($arrCat as $key => $value) {
            if ($value['de_pid'] == $parent_id) {
                $value['level'] = $level;
                $arrTree[] = $value;
                unset($arrCat[$key]); //注销当前节点数据，减少已无用的遍历
                getMenuTree($arrCat, $value['de_id'], $level);
            }
        }
        return $arrTree;
    }
}

if (! function_exists('Arr2sort')) {
    /*************************************/
    /* 从上面的例子不难看出，array_multisort()函数
    * 是将每一个二维数组的列作为 一个参数进行排序
    * 来达到整个数组的排序
    */
    /*************************************/
    function Arr2sort($data, $col, $type = SORT_DESC)
    {
        if (is_array($data)) {
            $i = 0;
            foreach ($data as $k => $v) {
                if (key_exists($col, $v)) {
                    $arr[$i] = $v[$col];
                    $i++;
                } else {
                    continue;
                }
            }
        } else {
            return false;
        }
        array_multisort($arr, $type, $data);
        return $data;
    }
}
if (! function_exists('arrayToSequence')) {
    function arrayToSequence($array, $field, $sort = 'SORT_DESC')
    {
        $arrSort = array();
        foreach ($array as $uniqid => $row) {
            foreach ($row as $key => $value) {
                $arrSort[$key][$uniqid] = $value;
            }
        }
        array_multisort($arrSort[$field], constant($sort), $array);
        return $array;
    }
}
if (! function_exists('array_no_empty')) {
    /*
     *  二维数组去控制
     */
    function array_no_empty($arr)
    {
        if (is_array($arr)) {
            foreach ($arr as $k => $v) {
                if (empty($v) || count($v)==0) {
                    unset($arr[$k]);
                } elseif (is_array($v) && !empty($v)) {
                    $arr[$k] = array_no_empty($v);
                }
            }
        }
        return $arr;
    }
}

if (! function_exists('group_same_key')) {
    /**
     * 数组分类
     * @param array $arr 要转换的数据集
     * @param string $key 自增字段（栏目id）
     * @author lpd <1696232133@qq.com>
     */
    function group_same_key($arr, $key)
    {
        $new_arr = array();
        foreach ($arr as $k => $v) {
            $new_arr[$v[$key]][] = $v;
        }
        return $new_arr;
    }
}

if (! function_exists('curl_post')) {
    function curl_post($url, array $params = array(), $timeout = 8)
    {
        $ch = curl_init();//初始化curl
        curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
        curl_setopt($ch, CURLOPT_HEADER, 0);//设置header
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        $data = curl_exec($ch);//运行curl
        curl_close($ch);
        return ($data);//输出结果
    }
}

if (! function_exists('curl_post_json')) {
    function curl_post_json($url, $params, $timeout = 8)
    {
        $headers = array(
            "Content-type: application/json;charset='utf-8'",
            "Accept: application/json",
            "Cache-Control: no-cache",
            "Pragma: no-cache",
        );
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_TIMEOUT, 60); //设置超时
        if(0 === strpos(strtolower($url), 'https')) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //对认证证书来源的检查
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); //从证书中检查SSL加密算法是否存在
        }
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, ($params));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        $data = curl_exec($ch);//CURLOPT_RETURNTRANSFER 不设置  curl_exec返回TRUE 设置  curl_exec返回json(此处) 失败都返回FALSE
        curl_close($ch);
        return ($data);//输出结果
    }
}

if (! function_exists('curl_get')) {
    function curl_get($url, array $params = array(), $timeout = 5)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        $file_contents = curl_exec($ch);
        curl_close($ch);
        return $file_contents;
    }
}

if (! function_exists('getRandStr')) {
    function getRandStr($length = 8)
    {
        // 密码字符集，可任意添加你需要的字符
        $chars = '0123456789012345678901234567890123456789';
        $password = '';
        for ($i = 0; $i < $length; $i++) {
            // 这里提供两种字符获取方式
            // 第一种是使用 substr 截取$chars中的任意一位字符；
            // 第二种是取字符数组 $chars 的任意元素
            // $password .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
            $password .= $chars[mt_rand(0, strlen($chars) - 1)];
        }
        return $password;
    }
}

if (! function_exists('getSignature')) {
    /**
     * @brief 使用HMAC-SHA1算法生成oauth_signature签名值
     *
     * @param $key 密钥
     * @param $str 源串
     *
     * @return 签名值
     */
    function getSignature($str, $key)
    {
        $signature = "";
        if (function_exists('hash_hmac')) {
            $signature = base64_encode(hash_hmac("sha1", $str, $key, true));
        } else {
            $blocksize = 64;
            $hashfunc = 'sha1';
            if (strlen($key) > $blocksize) {
                $key = pack('H*', $hashfunc($key));
            }
            $key = str_pad($key, $blocksize, chr(0x00));
            $ipad = str_repeat(chr(0x36), $blocksize);
            $opad = str_repeat(chr(0x5c), $blocksize);
            $hmac = pack(
                'H*',
                $hashfunc(
                    ($key ^ $opad) . pack(
                        'H*',
                        $hashfunc(
                            ($key ^ $ipad) . $str
                        )
                    )
                )
            );
            $signature = base64_encode($hmac);
        }
        return $signature;
    }
}

if (!function_exists('gzdecode')) {
    /**
     * @brief 解压http传递的body数据zip包
     *
     * @param $data zip数据
     *
     * @return $unpacked
     */
    function gzdecode($data)
    {
        $flags = ord(substr($data, 3, 1));
        $headerlen = 10;
        $extralen = 0;
        $filenamelen = 0;
        if ($flags & 4) {
            $extralen = unpack('v', substr($data, 10, 2));
            $extralen = $extralen[1];
            $headerlen += 2 + $extralen;
        }
        if ($flags & 8) { // Filename
            $headerlen = strpos($data, chr(0), $headerlen) + 1;
        }
        if ($flags & 16) { // Comment
            $headerlen = strpos($data, chr(0), $headerlen) + 1;
        }
        if ($flags & 2) { // CRC at end of file
            $headerlen += 2;
        }
        $unpacked = @gzinflate(substr($data, $headerlen));
        if ($unpacked === false) {
            $unpacked = $data;
        }
        return $unpacked;
    }
}

if (!function_exists('getWeekBE')) {
    //获得任意一个星期的开始时间，结束时间
    function getWeekBE($day)
    {
        $lastday = date('Y-m-d', strtotime("$day Sunday"));
        $firstday = date('Y-m-d', strtotime("$lastday -6 days"));
        return array(strtotime($firstday), strtotime($lastday) + 24 * 3600 - 1);
    }
}
if (!function_exists('get_weekend_days')) {
    // 返回某一时间段内有多少周
    function get_weekend_days($start, $end)
    {
        $days = (strtotime($end) - strtotime($start)) / 86400;
        return floor($days / 7);
    }
}
if (!function_exists('getallheaders')) {
    /*
     * 获取头部信息
     */
    function getallheaders()
    {
        foreach ($_SERVER as $name => $value) {
            if (substr($name, 0, 5) == 'HTTP_') {
                $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
            }
        }
        return $headers;
    }
}
if (!function_exists('convertUrlQuery')) {
    function convertUrlQuery($query)
    {
        $queryParts = explode('&', $query);
        $params = array();
        foreach ($queryParts as $param) {
            $item = explode('=', $param);
            $params[$item[0]] = $item[1];
        }
        return $params;
    }
}
if (!function_exists('custom_time_formate')) {
    /**
     * 时间戳转个性化显示
     * @param $time
     * @return false|string
     */
    function custom_time_formate($time)
    {
        //获取今天凌晨的时间戳
        $day = strtotime(date('Y-m-d', time()));
        //获取昨天凌晨的时间戳
        $pday = strtotime(date('Y-m-d', strtotime('-1 day')));
        //获取现在的时间戳
        $nowtime = time();

        $tc = $nowtime - $time;

        if ($time < $pday) {
            $str = date('Y-m-d H:i:s', $time);
        } elseif ($time < $day && $time > $pday) {
            $str = "昨天";
        } elseif ($tc > 60 * 60) {
            $str = floor($tc / (60 * 60)) . "小时前";
        } elseif ($tc > 60) {
            $str = floor($tc / 60) . "分钟前";
        } else {
            $str = "刚刚";
        }
        return $str;
    }
}
if (!function_exists('chinesesubstr')) {
    /*
     *  截取中文字符串
     */
    function chinesesubstr($str, $start, $len)
    {
        $tmpstr = '';
        $strlen = $len - $start;    //定义需要截取字符的长度
        for ($i = 0; $i < $strlen; $i++) {                   //使用循环语句，单字截取，并用$tmpstr.=$substr(？，？，？)加起来
            if (ord(substr($str, $i, 1)) > 0xa0) {     //ord()函数取得substr()的第一个字符的ASCII码，如果大于0xa0的话则是中文字符
                $tmpstr .= substr($str, $i, 3);        //设置tmpstr递加，substr($str,$i,3)的3是指三个字符当一个字符截取(因为utf8编码的三个字符算一个汉字)
                $i += 2;
            } else {                                             //其他情况（英文）按单字符截取
                $tmpstr .= substr($str, $i, 1);
            }
        }
        return $tmpstr;
    }
}
if (!function_exists('getVal')) {
    /*
     *  找出数组中离某一值最近的值
     */
    function getArrrySimilarVal($x, $arr1)
    {
        $count = count($arr1);
        for ($i = 0; $i < $count; $i++) {
            if (isset($arr1[$i + 1])) {
                if ($x >= $arr1[$i] && $x <= $arr1[$i + 1]) {
                    return $arr1[$i + 1];
                }
            } else {
                if ($x >= $arr1[$i]) {
                    return $arr1[0];
                }
            }
        }
    }
}
if (!function_exists('findNum')) {
    /**
     * 数据整形
     *
     * @param string $str
     * @return int
     */
    function findNum($str = '') : int
    {
        $str=trim($str);
        if (empty($str)) {
            return '';
        }
        $result='';
        for ($i=0; $i<strlen($str); $i++) {
            if (is_numeric($str[$i])) {
                $result.=$str[$i];
            }
        }
        return intval(substr($result, -2));
    }
}
if (!function_exists('secsToDstr')) {
    /**
     * 天 时 分 秒
     *
     * @param $secs
     * @return string
     */
    function secsToDstr($secs)
    {
        if ($secs >= 86400) {
            $days = floor($secs / 86400);
            $secs = $secs % 86400;
            $r = $days . ' 天';
            if ($days <> 1) {
                $r .= 's';
            }
            if ($secs > 0) {
                $r .= ' ';
            }
        }
        if ($secs >= 3600) {
            $hours = floor($secs / 3600);
            $secs = $secs % 3600;
            $r .= $hours . ' 小时';
            if ($hours <> 1) {
                $r .= 's';
            }
            if ($secs > 0) {
                $r .= ' ';
            }
        }
        if ($secs >= 60) {
            $minutes = floor($secs / 60);
            $secs = $secs % 60;
            $r .= $minutes . ' 分钟';
            if ($minutes <> 1) {
                $r .= 's';
            }
            if ($secs > 0) {
                $r .= ' ';
            }
        }
        $r .= $secs . ' 秒';
        if ($secs <> 1) {
            $r .= 's';
        }
        return $r;
    }
}

if (!function_exists('sec2time')) {
    /**
     * Author:
     *
     * 将秒（非时间戳）转化成 ** 小时 ** 分
     */
    function sec2time($seconds, $flag=true){
        if(intval($seconds) < 60)
            $tt = intval(sprintf("%02d",intval($seconds%60)))." 秒";
        if(intval($seconds) >=60){
            $h =sprintf("%02d",intval($seconds/60));
            $s =sprintf("%02d",intval($seconds%60));
            if($s == 60){
                $s = sprintf("%02d",0);
                ++$h;
            }
            $t = "00";
            if($h == 60){
                $h = sprintf("%02d",0);
                ++$t;
            }
            if($t){
                $t  = sprintf("%02d",$t);
            }
            if($t=='00') {
                if($flag) {
                    $tt = intval($h) . " 分 " . intval($s) . ' 秒 ';
                } else {
                    $tt = intval($h) . " 分 " ;
                }
            } else {
                if($flag) {
                    $tt = intval($t) . " 时 " . intval($h) . " 分 " . intval($s) . ' 秒';
                } else {
                    $tt = intval($t) . " 时 " . intval($h) . " 分 " ;
                }
            }
        }
        if(intval($seconds)>=60*60){
            $t= sprintf("%02d",intval($seconds/3600));
            $h =sprintf("%02d",intval($seconds/60)-$t*60);
            $s =sprintf("%02d",intval($seconds%60));
            if($s == 60){
                $s = sprintf("%02d",0);
                ++$h;
            }
            if($h == 60){
                $h = sprintf("%02d",0);
                ++$t;
            }
            if($t){
                $t  = sprintf("%02d",$t);
            }
            if($flag) {
                $tt = intval($t) . " 时 " . intval($h) . " 分 " . intval($s) . ' 秒';
            } else {
                $tt = intval($t) . " 时 " . intval($h) . " 分 " ;
            }
        }
        return  $seconds>0?$tt:'';
    }
}
if (!function_exists('downfile')) {
    /**
     * 下载文件
     *
     * @param $fileurl
     * @param $file_name
     */
    function downfile($fileurl, $file_name)
    {
        $filename = $fileurl;
        $file = fopen($filename, "rb");
        Header("Content-type:  application/octet-stream ");
        Header("Accept-Ranges:  bytes ");
        Header("Content-Disposition:  attachment;  filename= $file_name");
        $contents = "";
        while (!feof($file)) {
            $contents .= fread($file, 8192);
        }
        echo $contents;
        fclose($file);
    }
}
if (!function_exists('re2float')) {
    /**
     * 返回两位小数
     *
     * @param $num
     * @return string
     */
    function re2float($num)
    {
        return number_format($num, 2, '.', '');
    }
}
if (!function_exists('_request')) {
    /**
     * 返回两位小数
     *
     * @param $num
     * @return string
     */
    function _request($str)
    {
        $parr = explode(";",$str);
        $data = [];
        foreach ($parr as $val) {
            if($val) {
                $tmp = explode(':', $val);
                $data[$tmp[0]] = $tmp[1];
            }
        }
        return $data;
    }
}

if (!function_exists('myGetImageSize')) {
    /**
     * 获取远程图片的宽高和体积大小
     *
     * @param string $url 远程图片的链接
     * @param string $type 获取远程图片资源的方式, 默认为 curl 可选 fread
     * @param boolean $isGetFilesize 是否获取远程图片的体积大小, 默认false不获取, 设置为 true 时 $type 将强制为 fread
     * @return false|array
     */
    function myGetImageSize($url, $type = 'curl', $isGetFilesize = false)
    {
        // 若需要获取图片体积大小则默认使用 fread 方式
        $type = $isGetFilesize ? 'fread' : $type;

        if ($type == 'fread') {
            // 或者使用 socket 二进制方式读取, 需要获取图片体积大小最好使用此方法
            $handle = fopen($url, 'rb');

            if (!$handle) return false;

            // 只取头部固定长度168字节数据
            $dataBlock = fread($handle, 168);
        } else {
            // 据说 CURL 能缓存DNS 效率比 socket 高
            $ch = curl_init($url);
            // 超时设置
            curl_setopt($ch, CURLOPT_TIMEOUT, 5);
            // 取前面 168 个字符 通过四张测试图读取宽高结果都没有问题,若获取不到数据可适当加大数值
            curl_setopt($ch, CURLOPT_RANGE, '0-167');
            // 跟踪301跳转
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            // 返回结果
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            $dataBlock = curl_exec($ch);

            curl_close($ch);

            if (!$dataBlock) return false;
        }

        // 将读取的图片信息转化为图片路径并获取图片信息,经测试,这里的转化设置 jpeg 对获取png,gif的信息没有影响,无须分别设置
        // 有些图片虽然可以在浏览器查看但实际已被损坏可能无法解析信息
        $size = getimagesize('data://image/jpeg;base64,' . base64_encode($dataBlock));
        if (empty($size)) {
            return false;
        }

        $result['width'] = $size[0];
        $result['height'] = $size[1];

        // 是否获取图片体积大小
        if ($isGetFilesize) {
            // 获取文件数据流信息
            $meta = stream_get_meta_data($handle);
            // nginx 的信息保存在 headers 里，apache 则直接在 wrapper_data
            $dataInfo = isset($meta['wrapper_data']['headers']) ? $meta['wrapper_data']['headers'] : $meta['wrapper_data'];

            foreach ($dataInfo as $va) {
                if (preg_match('/length/iU', $va)) {
                    $ts = explode(':', $va);
                    $result['size'] = trim(array_pop($ts));
                    break;
                }
            }
        }

        if ($type == 'fread') fclose($handle);

        return $result;
    }
}
if (!function_exists('toJson')) {
    /**
     * 将数组里面带有中文的字串保留以JSON格式返回
     *
     * @param   array $arr 数组
     * @return  string JSON格式的字符串
     */

    function toJson($arr)
    {

        $ajax = ToUrlencode($arr);
        $str_json = json_encode($ajax);
        return urldecode($str_json);
    }
}
if (!function_exists('ToUrlencode')) {
    /**
     * 将数组里面带有中文的字串用urlencode转换格式返回
     *
     * @param   array $arr 数组
     * @return  array
     */
    function ToUrlencode($arr)
    {

        $temp = array();
        if (is_array($arr)) {
            foreach ($arr AS $key => $row) {
                $temp[$key] = $row;
                if (is_array($temp[$key])) {
                    $temp[$key] = ToUrlencode($temp[$key]);
                } else {
                    $temp[$key] = urlencode($row);
                }
            }
        } else {
            $temp = $arr;
        }
        return $temp;
    }
}
if (!function_exists('getalphnum')) {
    /**
     *
     * @param $char
     * @return int|mixed
     */
    function getalphnum($char)
    {
        $array = array(
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 
            'h', 'i', 'j', 'k', 'l', 'm', 'n', 
            'o', 'p', 'q', 'r', 's', 't', 
            'u', 'v', 'w', 'x', 'y', 'z',
            // 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'ag', 
            // 'ah', 'ai', 'aj', 'ak', 'al', 'am', 'an', 
            // 'ao', 'ap', 'aq', 'ar', 'as', 'at', 
            // 'au', 'av', 'aw', 'ax', 'ay', 'az'
        );
        $len = strlen($char);
        $sum = 0;
        for ($i = 0; $i < $len; $i++) {
            $index = array_search($char[$i], $array);
            $sum += ($index + 1) * pow(26, $len - $i - 1);
        }
        return $sum;
    }
}
if (!function_exists('getnumhalp')) {
    /**
     * @param $num
     * @return mixed
     */
    function getnumhalp($num)
    {
        // $array = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
        $array = array(
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 
            'h', 'i', 'j', 'k', 'l', 'm', 'n', 
            'o', 'p', 'q', 'r', 's', 't', 
            'u', 'v', 'w', 'x', 'y', 'z',
            'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'ag', 
            'ah', 'ai', 'aj', 'ak', 'al', 'am', 'an', 
            'ao', 'ap', 'aq', 'ar', 'as', 'at', 
            'au', 'av', 'aw', 'ax', 'ay', 'az',
        );
        return $array[$num];
    }
}
if (!function_exists('sendHttpRequest')) {
    function sendHttpRequest($url, $params)
    {
        $opts = getRequestParamString($params);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//不验证证书
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//不验证HOST
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-type:application/x-www-form-urlencoded;charset=UTF-8'
        ));
        curl_setopt($ch, CURLOPT_POSTFIELDS, $opts);
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.2) Gecko/20090803 Fedora/3.5.2-2.fc11 Firefox/3.5.2");

        /**
         * 设置cURL 参数，要求结果保存到字符串中还是输出到屏幕上。
         */
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        // 运行cURL，请求网页
        $html = curl_exec($ch);
        // close cURL resource, and free up system resources
        curl_close($ch);
        return $html;
    }
}
if (!function_exists('getRequestParamString')) {
    /**
     * 组装报文
     *
     * @param unknown_type $params
     * @return string
     */
    function getRequestParamString($params)
    {
        $params_str = '';
        foreach ($params as $key => $value) {
            $params_str .= ($key . '=' . (!isset ($value) ? '' : urlencode($value)) . '&');
        }
        return substr($params_str, 0, strlen($params_str) - 1);
    }
}
if (!function_exists('unZip')) {
    function unZip($dir)
    {
        $zip = zip_open($dir);
        $dirnames = dirname($dir);

        if ($zip) {
            while ($zip_entry = zip_read($zip)) {
                if (zip_entry_open($zip, $zip_entry, "r")) {
                    $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));    // 读取zip文件, 并制定读取的长度

                    $fname = $dirnames . '/' . zip_entry_name($zip_entry);
                    if (is_dir($fname))                                           // 如果是目录则创建目录(目录是未创建的)
                    {
                        mk_dir($dirnames . '/' . zip_entry_name($zip_entry));
                    } else                                                         // 是文件
                    {
                        mk_dir(dirname($fname));
                        file_put_contents($fname, $buf);                          // 将读取到的内容直接写入文件
                    }
                    zip_entry_close($zip_entry);
                }
            }
            zip_close($zip);
        }
    }
}

if (!function_exists('mk_dir')) {
    // 循环创建目录
    function mk_dir($dir, $mode = 0777)
    {
        if (is_dir($dir) || @mkdir($dir, $mode)) {
            return true;
        }
        if (!mk_dir(dirname($dir), $mode)) {
            return false;
        }
        return @mkdir($dir, $mode);
    }
}